/* DECISOES DE PROJETO */
/* 1. qualquer pontuacao marca a separacao de duas frases */
/* 2. palavras sao compostas somentes por letras */

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

#define FALSE 	0
#define TRUE 	1
#define ERRO 	-1

/* comparar dois caracteres 'case insensitive' */
int isIgual(char a, char b){

	if(a == b)
		return TRUE;
	else if((a >= 65) && (a <= 90) && (b >= 97) && (b <= 122) && (a == (b -32)))
		return TRUE;
	else if((b >= 65) && (b <= 90) && (a >= 97) && (a <= 122) && (b == (a -32)))
		return TRUE;
	else
		return FALSE;

}

/* verificar se a palavra e um palindromo */
int isPalindromo(char *palavra, int esq, int dir){

	if(palavra == NULL)
		return ERRO;

	if(dir - esq < 0)
		return ERRO;

	if(dir - esq == 0)
		return TRUE;

	else if((dir - esq == 1) && (isIgual(palavra[esq], palavra[dir])))
		return TRUE;

	else if( isIgual(palavra[esq], palavra[dir])){

		esq ++;
		dir --;

		return isPalindromo(palavra, esq, dir);

	}

	return FALSE;
}

/* determinar se o caractere e uma letra */
int isLetra(char c){

	if(((c >= 97) && (c <= 122)) || ((c >= 65) && (c <= 90)))
		return TRUE;

	return FALSE;

}

int isPalavra(char *palavra){

	int i;

	for(i = 0; i < strlen(palavra); ++i)
		if(!isLetra(palavra[i]))
			return FALSE;

	return TRUE;

}

/* remover sinais de pontuacao do fim das palavras */
int removerSinal(char *palavra){

	if(palavra == NULL)
		return ERRO;

	if(!isLetra(palavra[strlen(palavra) - 1])){

		palavra[strlen(palavra) - 1] = '\0';
		return TRUE;

	}
	else
		return FALSE;

}


/* main aceita especificacao do arquivo, se nao for especificado, abre texto-pequeno.txt */
int main(int args, char **argv){

	FILE *ifp;

	time_t inicio, fim;

	time(&inicio);

	if(args > 0)
		ifp = fopen(argv[1], "rb");

	else
		ifp = fopen("texto-pequeno.txt", "rb");

	if(ifp == NULL)
		return 0;


	int total = 0, frase = 0, sinal, i = 1; /* quantidade total de palindromos, quantidade por frase e valor booleano para teste */
	char *palavra = (char *)malloc(1024 * sizeof(char));

	while(fscanf(ifp, "%s", palavra) > 0){

		

		sinal = removerSinal(palavra);

		if(!isPalavra(palavra))
			continue;

		if(isPalindromo(palavra, 0, strlen(palavra) - 1)){
			frase++;
			total++;

		}

		if(sinal == TRUE){

			printf("%d palindromos na frase %d\n", frase, i);
			++i;
			frase = 0;

		}

	}

	time(&fim);

	printf("%d palindromos no total\n", total);
	printf("execucao %.f\n", difftime(fim, inicio));

	free(palavra);
	fclose(ifp);

	return 0;
}
